// 引入模块----------
// 错误中间件
// var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
// 访问路由的日志
// var logger = require('morgan');

// 引入路由模块-------------
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

// 搭建服务器
var app = express();

// view engine setup  设置模板引擎---------------------------
// 设置模板的文件夹
app.set('views', path.join(__dirname, 'views') );
// 设置模板引擎为ejs
app.set('view engine', 'ejs');


// 注册中间件-----------------------------
// app.use(logger('dev'));
// post参数
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
// cookie
app.use(cookieParser());

// 开放静态资源
app.use(express.static(path.join(__dirname, 'public')));

// 注册路由中间件------------------
app.use('/', indexRouter);
app.use('/users', usersRouter);

// 错误中间件-------------------------------
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  // next(createError(404));
  // next({
  //   status:404,
  //   msg:"出错了"
  // })

  res.send({
    status:404,
    msg:"此页面不存在"
  })
});

// error handler 逻辑业务错误统一处理
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  // res.locals.message = err.message; // 设置错误提示信息
  // res.locals.error = req.app.get('env') === 'development' ? err : {}; //设置开发环境的错误

  // render the error page
  // res.status(err.status || 500); // 设置状态吗
  // res.render('error'); // 渲染错误页面

  // console.log(err);

  res.send({
    status:err.status || 500,
    msg:err.msg || "服务器出问题了"
  })
});

module.exports = app;


// 为什么要把端口号 提出来  把app.js封装模块？
// 为了模块化的管理，作为入口文件的app.js 主要设置配置各项路由和中间件
// 把端口号单独抽离出来，单独管理（比如选择的端口要是否合理）
// 把启动文件设置为www,避免app.js直接被外界访问到，保障了项目的安全性，避免app.js中的内容直接被获取到，而被乱用
